package com.shenzw.common.handler;

import com.shenzw.common.config.pojo.FailInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * 编写 SysExceptionHandler 统一错误处理类，在其类上标注 @RestControllerAdvice 注解表示该类是一个出现错误时候需要起作用的切面，并且类下的所有方法返回值都会以 JSON 形式返回处理
 *
 * @author shenzw
 * @date 2023/10/30
 */
@Slf4j
@RestControllerAdvice
public class SysExceptionHandler {

    /**
     * 最大的兜底错误处理
     * <p/>
     * 注意：@ExceptionHandler 中 value 的值会匹配最近下业务抛出错的类型的值（你们应该能懂吧！）
     *
     * @return FailInfo
     */
    @ExceptionHandler(value = Exception.class)
    public FailInfo exception(Exception ex) {
        log.error("SysExceptionHandler exception：{}", ex.getMessage());
        log.error("SysExceptionHandler exception！", ex);

        return FailInfo.builder()
                .exception(ex.getMessage())
                .build();
    }

    /**
     * RuntimeException 异常处理
     *
     * @return FailInfo
     */
    @ExceptionHandler(value = RuntimeException.class)
    public FailInfo runtimeException(RuntimeException ex) {
        log.error("SysExceptionHandler runtimeException：{}", ex.getMessage());
        log.error("SysExceptionHandler runtimeException！", ex);

        return FailInfo.builder()
                .exception(ex.getMessage())
                .build();
    }

    /// ....还可以加更多的异常的不同业务逻辑处理【拓展】；运行就近异常处理方法
}
